const { UserModel } = require('../../models/index')
const { Op } = require('sequelize')

// 获取用户信息列表
const getUserInfoList = async (req, res) => {
  try {
    // 从分页中间件中获取分页信息
    const { offset, pageSize } = req.pagination;

    const userList = await UserModel.findAndCountAll({
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    // 返回成功的响应
    res.status(200).json({
      title: '用户信息列表',
      data: userList
    })
  } catch (error) {
    return res.status(500).json({ error: error.message })
  }
}

// 用户列表搜索功能
const searchUser = async (req, res) => {
  try {
    // 获取用户输入的搜索词
    const searchText = req.query.data

    // 如果搜索词为空返回空数组
    if (!searchText || searchText.trim() === '') {
      return res.status(200).json([])
    }

    // 搜索匹配内容
    const userItem = await UserModel.findAll({
      where: {
        [Op.or]: [
          { name: { [Op.like]: `%${searchText}%` } },
          { username: { [Op.like]: `%${searchText}%` } },
          { email: { [Op.like]: `%${searchText}%` } },
          { phone: { [Op.like]: `%${searchText}%` } },
          { status: { [Op.like]: `%${searchText}%` } }
        ]
      }
    })

    // 返回查询结果
    return res.status(200).json({
      title: '搜索成功',
      data: userItem
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 设置用户账号禁言
const setUserMute = async (req, res) => {
  try {
    // 获取用户ID
    const userID = req.params.id

    // 用户ID为空的情况
    if (!userID) {
      return res.status(400).json({
        error: '用户ID不能为空'
      })
    }

    // 获取需要设置的禁言时间
    const { mute_time } = req.query

    // 禁言时间为空的情况
    if (!mute_time) {
      return res.status(400).json({
        error: '禁言时间不能为空'
      })
    }

    // 计算禁言结束时间
    let muteUntil
    const now = Date.now()
    switch (mute_time) {
      case '1m':
        muteUntil = new Date(now + 1 * 60 * 1000)
        break
      case '3d':
        muteUntil = new Date(now + 3 * 24 * 60 * 60 * 1000)
        break
      case '7d':
        muteUntil = new Date(now + 7 * 24 * 60 * 60 * 1000)
        break
      case '30d':
        muteUntil = new Date(now + 30 * 24 * 60 * 60 * 1000)
        break
    }

    // 查找用户
    const userItem = await UserModel.findByPk(userID)

    // 查找用户失败的情况
    if (!userItem) {
      return res.status(404).json({
        error: '未找到用户'
      })
    }

    // 更新用户禁言状态和禁言结束时间
    await userItem.update(
      { status: '禁言', mute_until: muteUntil },
      { where: { id: userID } }
    );

    // 返回成功响应
    return res.status(200).json({
      title: '用户账号禁言设置成功'
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 封禁用户账号
const banUserAccount = async (req, res) => {
  try {
    // 获取用户ID
    const userID = req.params.id

    // 用户ID为空的情况
    if (!userID) {
      return res.status(400).json({
        error: '用户ID不能为空'
      })
    }

    // 查找用户
    const userItem = await UserModel.findByPk(userID)

    // 查找用户失败的情况
    if (!userItem) {
      return res.status(404).json({
        error: '未找到用户'
      })
    }

    // 封禁用户账号
    await userItem.update(
      { status: '封禁' },
      { where: { id: userID } }
    );

    // 返回成功响应
    return res.status(200).json({
      title: '用户账号封禁成功'
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 解封用户账号
const unbanUserAccount = async (req, res) => {
  try {
    // 获取用户ID
    const userID = req.params.id

    // 用户ID为空的情况
    if (!userID) {
      return res.status(400).json({
        error: '用户ID不能为空'
      })
    }

    // 查找用户
    const userItem = await UserModel.findByPk(userID)

    // 查找用户失败的情况
    if (!userItem) {
      return res.status(404).json({
        error: '未找到用户'
      })
    }

    // 解封用户账号
    await userItem.update(
      { status: '正常', mute_until: null },
      { where: { id: userID } }
    );

    // 返回成功响应
    return res.status(200).json({
      title: '用户账号解封成功'
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}


module.exports = {
  getUserInfoList,
  searchUser,
  setUserMute,
  banUserAccount,
  unbanUserAccount
}